package tech.edwardvan.java.generic;

import lombok.Data;

/**
 * 泛型接口
 *
 * @author EdwardVan
 */
public class GenericInterfaceDemo {

    public static void main(String[] args) {
        //实现接口不指定泛型
        ContainerChild1 c1 = new ContainerChild1();
        c1.setT("test");
        c1.setT(1);

        //实现接口指定泛型
        ContainerChild2 c2 = new ContainerChild2();
        c2.setT("test");
        //c2.setT(1);//error

        //实现接口保留泛型
        ContainerChild3<Integer> c3 = new ContainerChild3<>();
        //c3.setT("test");//error
        c3.setT(1);
    }

    /**
     * 泛型接口
     */
    public interface GenericInterface<T> {
        T getT();

        void setT(T t);
    }

    /**
     * 实现接口不指定泛型
     */
    @Data
    public static class ContainerChild1 implements GenericInterface {
        private Object t;
    }

    /**
     * 实现接口指定泛型
     */
    @Data
    public static class ContainerChild2 implements GenericInterface<String> {
        private String t;
    }

    /**
     * 实现接口保留泛型
     */
    @Data
    public static class ContainerChild3<T> implements GenericInterface<T> {
        private T t;
    }

}
